﻿using System;
using System.Linq;
using Cesave.Domain.PermisosModule.Contracts.Estados;
using Cesave.Infrastructure.CrossCutting.IoC;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Cesave.Domain.PermisosModule.Tests.ServicesTests
{
    [TestClass]
    [DeploymentItem("Cesave.Infrastructure.Data.PermisosModule.Mock.dll")]
    [DeploymentItem("Cesave.Infrastructure.Data.PermisosModule.dll")]
    public class EstadoServiceTests
    {

        [TestMethod]
        public void FindAllEstados_Invoke()
        {
            // Arrange
            IEstadoService service = IoCFactory.Resolve<IEstadoService>();

            // Act
            var actual = service.FindAllEstados();

            // Assert
            Assert.IsNotNull(actual);
            Assert.AreEqual(2, actual.Count());
            Assert.AreEqual(26, actual[1].EstadoId);
        }

        [TestMethod]
        public void FindEstadosByStatus_Invoke()
        {
            // Arrange
            IEstadoService service = IoCFactory.Resolve<IEstadoService>();
            
            // Act
            var actual = service.FindEstadosByStatus(true);

            // Assert
            Assert.IsNotNull(actual);
            Assert.AreEqual(1, actual.Count());
            Assert.AreEqual(26, actual[0].EstadoId);
        }

        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void ChangeEstado_Null_Estado_Throws_Argument_Null_Exception()
        {
            // Arrange
            IEstadoService service = IoCFactory.Resolve<IEstadoService>();

            // Act
            service.ChangeEstado(null);
        }

        [TestMethod]
        [ExpectedException(typeof(InvalidOperationException))]
		public void FindEstadoByGuid_Empty_Guid_Throws_InvalidOperationException()
        {
            // Arrange
            IEstadoService service = IoCFactory.Resolve<IEstadoService>();

            // Act
            var actual = service.FindEstadoByGuid(Guid.Empty);
        }

        [TestMethod]
        public void ChangeEstado_Invoke()
        {
            // Arrange
            IEstadoService service = IoCFactory.Resolve<IEstadoService>();

			Guid estadoGuid = new Guid("B13F5C3F-AA42-4943-A8E9-49BA546EE5D1");

            var expected = service.FindEstadoByGuid(estadoGuid);

			string nombre = string.Format("{0} Testing", expected.Nombre);
			expected.Nombre = nombre;

            // Act
            service.ChangeEstado(expected);

            var actual = service.FindEstadoByGuid(estadoGuid);

            // Assert
            Assert.AreSame(expected, actual);
			Assert.AreEqual(nombre, actual.Nombre);

			actual.Nombre = "Sonora";
			service.ChangeEstado(actual);
        }

		[TestMethod]
		[ExpectedException(typeof(ArgumentNullException))]
		public void ActivateEstado_Null_Estado_Throws_ArgumentNullException()
		{
			// Arrange
			IEstadoService service = IoCFactory.Resolve<IEstadoService>();

			// Act
			service.ActivateEstado(null);
		}

		[TestMethod]
		public void ActivateEstado_Invoke()
		{
			// Arrange
			IEstadoService service = IoCFactory.Resolve<IEstadoService>();

			Guid estadoGuid = new Guid("B13F5C3F-AA42-4943-A8E9-49BA546EE5D1");
			var expected = service.FindEstadoByGuid(estadoGuid);

			// Act
			service.ActivateEstado(expected);

			var actual = service.FindEstadoByGuid(estadoGuid);

			// Assert
			Assert.IsTrue(actual.Status);
			service.DeactivateEstado(actual);
			// clean
			service.DeactivateEstado(actual);
		}

		[TestMethod]
		[ExpectedException(typeof(ArgumentNullException))]
		public void DeactivateEstado_Null_Estado_Throws_ArgumentNullException()
		{
			// Arrange
			IEstadoService service = IoCFactory.Resolve<IEstadoService>();

			// Act
			service.DeactivateEstado(null);
		}

		[TestMethod]
		public void DeactivateEstado_Invoke()
		{
			// Arrange
			IEstadoService service = IoCFactory.Resolve<IEstadoService>();

			Guid estadoGuid = new Guid("B13F5C3F-AA42-4943-A8E9-49BA546EE5D1");
			var expected = service.FindEstadoByGuid(estadoGuid);

			service.ActivateEstado(expected);

			// Act
			service.DeactivateEstado(expected);

			var actual = service.FindEstadoByGuid(estadoGuid);

			// Assert
			Assert.IsFalse(actual.Status);

			// clean
			service.ActivateEstado(actual);
		}

    }
}
